home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / libol / queue.h < prev    next >
C/C++ Source or Header  |  2005-10-16  |  4KB  |  115 lines

  1. /***************************************************************************
  2.  *
  3.  * Copyright (c) 1998-1999 Niels M÷ller
  4.  * Copyright (c) 1999 BalaBit Computing
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * (at your option) any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software
  18.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  *
  20.  * $Id: queue.h,v 1.3 1999/11/22 18:26:24 bazsi Exp $
  21.  *
  22.  ***************************************************************************/
  23.  
  24. #ifndef __QUEUE_H_INCLUDED
  25. #define __QUEUE_H_INCLUDED
  26.  
  27. #include "objects.h"
  28.  
  29. /* Layout taken from AmigaOS lists... The first node uses a prev
  30.  * pointer that points to the queue's HEAD. The last node uses a next
  31.  * pointer that points to the queue's TAIL field. The TAIL field is
  32.  * always NULL; TAILPREV points to the last node in the queue. */
  33. struct ol_queue_node
  34. {
  35.   struct ol_queue_node *np_links[2];
  36. };
  37. #define LSH_QUEUE_NEXT 0
  38. #define LSH_QUEUE_PREV 1
  39.  
  40. struct ol_queue
  41. {
  42.   struct ol_queue_node *ht_links[3];
  43. };
  44. #define LSH_QUEUE_HEAD 0
  45. #define LSH_QUEUE_TAIL 1
  46. #define LSH_QUEUE_TAILPREV 2
  47.  
  48. /* This macro must be used at the start of a block, to make the
  49.  * declarations legal. It is allowed to free n inside the loop. */
  50.  
  51. #define FOR_QUEUE(q, type, n)                    \
  52.   struct ol_queue_node *n##_this, *n##_next;            \
  53.   type n;                            \
  54.   for ( n##_this = (q)->ht_links[LSH_QUEUE_HEAD];        \
  55.     ( n = (type) n##_this,                    \
  56.       (n##_next = n##_this->np_links[LSH_QUEUE_NEXT]));    \
  57.     n##_this = n##_next)
  58.  
  59. void ol_queue_init(struct ol_queue *q);
  60. int ol_queue_is_empty(struct ol_queue *q);
  61. void ol_queue_add_head(struct ol_queue *q, struct ol_queue_node *n);
  62. void ol_queue_add_tail(struct ol_queue *q, struct ol_queue_node *n);
  63. void ol_queue_remove(struct ol_queue_node *n);
  64. struct ol_queue_node *ol_queue_remove_head(struct ol_queue *q);
  65. struct ol_queue_node *ol_queue_remove_tail(struct ol_queue *q);
  66.  
  67. #define CLASS_DECLARE
  68. #include "queue.h.x"
  69. #undef CLASS_DECLARE
  70.  
  71. /* Object queue */
  72. struct object_queue_node
  73. {
  74.   struct ol_queue_node header;
  75.   struct ol_object *o;
  76. };
  77.  
  78. /* CLASS:
  79.    (class
  80.      (name object_queue)
  81.      (vars
  82.        (q indirect-special "struct ol_queue"
  83.           do_queue_mark do_queue_free)))
  84. */
  85.  
  86. struct object_queue *make_object_queue(void);
  87.  
  88. int object_queue_is_empty(struct object_queue *q);
  89.  
  90. struct object_queue_node *object_queue_add_head(struct object_queue *q, struct ol_object *o);
  91. struct object_queue_node *object_queue_add_tail(struct object_queue *q, struct ol_object *o);
  92. struct ol_object *object_queue_remove_head(struct object_queue *q);
  93. struct ol_object *object_queue_remove_tail(struct object_queue *q);
  94.  
  95. struct ol_object *object_queue_peek_head(struct object_queue *q);
  96. struct ol_object *object_queue_peek_tail(struct object_queue *q);
  97.  
  98. void object_queue_remove(struct object_queue_node *n);
  99.  
  100. /* For explicitly allocated object queues, which are not included in a
  101.  * garbage collected object. */
  102. void object_queue_kill(struct object_queue *q);
  103.  
  104. #define KILL_OBJECT_QUEUE(q) object_queue_kill((q))
  105.  
  106. #define FOR_OBJECT_QUEUE(oq, n)                                 \
  107.   struct ol_queue_node *n##_this, *n##_next;                    \
  108.   struct ol_object *n;                                          \
  109.   for ( n##_this = (oq)->q.ht_links[LSH_QUEUE_HEAD];            \
  110.         ( n = ((struct object_queue_node *) n##_this)->o,       \
  111.           (n##_next = n##_this->np_links[LSH_QUEUE_NEXT]));     \
  112.         n##_this = n##_next)                                    \
  113.  
  114. #endif /* OL_QUEUE_H_INCLUDED */
  115.